

#include <stdio.h>
#include <stdlib.h>

#include "parseur_event.h"


// permet de faire un malloc de l'arbre
arbre* malloc_arbre() {
	// static int cpt = 0;
	arbre* tmp = (arbre*) malloc(sizeof(arbre));
	if(tmp == NULL)
		fprintf(stderr, "Malloc de l'arbre impossible.\n");
	// cpt = cpt + 1;
	return tmp;
}

// permet de faire un malloc d'un noeud
arbre malloc_child() {
	// static int cpt = 0;
	arbre tmp = (arbre) malloc(sizeof(struct noeud));
	if(tmp == NULL)
		fprintf(stderr, "Malloc de l'arbre impossible.\n");
	// cpt = cpt + 1;
	return tmp;
}

// permet de remplir les valeurs de recherche du noeud.
void child_noeud(arbre a, int index, int comp) {
	if(a == NULL)
		fprintf(stderr, "Child NULL.\n%d, %x", index, comp);
	else {
		a->index			= index;
		a->comp				= comp;

		a->inf_is_val		= false;
		a->inf_data.child	= NULL;

		a->sup_is_val		= false;
		a->sup_data.child	= NULL;
	}
}

// permet de remplir les valeurs de resultat du noeud si la comparaison est inferieur
void arbre_inf_set_val(arbre a, ushort event , ushort data_index ) {
	a->inf_is_val = true;
	a->inf_data.val_event.data_index = data_index;
	a->inf_data.val_event.event = event;
}

// permet de remplir les valeurs de resultat du noeud si la comparaison est superieur
void arbre_sup_set_val(arbre a, ushort event , ushort data_index ) {
	a->sup_is_val = true;
	a->sup_data.val_event.data_index = data_index;
	a->sup_data.val_event.event = event;
}

// permet de mettre le noeud suivant de recher si la comparaison est inferieur
void arbre_inf_set_noeud(arbre a, arbre noeud) {
	a->inf_is_val = false;
	a->inf_data.child = noeud;
}

// permet de mettre le noeud suivant de recher si la comparaison est superieur
void arbre_sup_set_noeud(arbre a, arbre noeud) {
	a->sup_is_val = false;
	a->sup_data.child = noeud;
}

// permet de charger la structure de recherche !
void load_all_arbre(arbre* a) {

	arbre tmp1, tmp2, tmp3, tmp4, tmp5;

	//lvl 0
	*a = malloc_child();
	child_noeud( *a , 1 , 0x47); // decoupage du premier caract�re entre F(46) et H(48) (details : a.txt)

		//lvl 1
		tmp1 = (*a)->inf_data.child = malloc_child();
		child_noeud( tmp1 , 1 , 0x42); // decoupage du premier caract�re entre B(42) et C(43) (details : a1.txt)

			//lvl 2
			tmp2 = tmp1->inf_data.child = malloc_child();
			child_noeud( tmp2 , 9 , 0x27); // decoupage du 9eme caract�re entre espace(20) et -(2D) (details : a11.txt)

				//lvl 3
				tmp3 = tmp2->inf_data.child = malloc_child();
				child_noeud( tmp3 , 10 , 0x66); // decoupage du 10eme caract�re entre d(64) et p(70) (details : a111.txt)
				child_noeud( tmp3->inf_data.child  = malloc_child() , 10 , 0x63);// decoupage du 10eme caract�re entre b(62) et d(64) (details : a111.txt)
				child_noeud( tmp3->sup_data.child  = malloc_child() , 10 , 0x72);// decoupage du 10eme caract�re entre p(70) et t(74) (details : a111.txt)

					//val lvl 4, a111.txt
					tmp4 = tmp3->inf_data.child;
					arbre_inf_set_val(tmp4, EVENT_BOMB_COLLECTED, 27 );
					arbre_sup_set_val(tmp4, EVENT_BOMB_DEFUSED, 20 );
					tmp4 = tmp3->sup_data.child;
					arbre_inf_set_val(tmp4, EVENT_BOMB_PLANTED, 20 );
					arbre_sup_set_val(tmp4, EVENT_BOMB_TOSSED, 19 );

				//lvl 3
				tmp3 = tmp2->sup_data.child  = malloc_child();
				child_noeud( tmp3 , 11 , 0x40); // decoupage du 11eme caract�re entre -(2D) et n(6E) (details : a112.txt)
				child_noeud( tmp3->inf_data.child  = malloc_child() , 1  , 0x30); // decoupage du 1eme caract�re entre -(2D) et B(42) (details : a112.txt)
				child_noeud( tmp3->sup_data.child  = malloc_child() , 17 , 0x49); // decoupage du 17eme caract�re entre B(42) et R(52) (details : a112.txt)

					//val lvl 4, a112.txt
					tmp4 = tmp3->inf_data.child;
					arbre_inf_set_val(tmp4, EVENT_BIG_MIDDLE_LINE, 60 );
					arbre_sup_set_val(tmp4, EVENT_BOMBHOLDER, 14 );
					tmp4 = tmp3->sup_data.child;
					arbre_inf_set_val(tmp4, EVENT_ASSASSINWINNER_BLUE, 37 );
					arbre_sup_set_val(tmp4, EVENT_ASSASSINWINNER_RED, 36 );

			//lvl 2
			tmp2 = tmp1->sup_data.child = malloc_child();
			child_noeud( tmp2 , 5 , 0x50); // decoupage du 5eme caract�re entre :(3A) et n(6E) (details : a12.txt)

				//lvl 3, a121.txt
				tmp3 = tmp2->inf_data.child = malloc_child();
				child_noeud( tmp3 , 4 , 0x70); // decoupage du 4eme caract�re entre g(67) et t(74) (details : a121.txt)

					//lvl 4, a1211.txt
					tmp4 = tmp3->inf_data.child = malloc_child();
					child_noeud( tmp4 , 5 , 0x2F); // decoupage du 5eme caract�re entre espace(20) et :(3A) (details : a1211.txt)
					child_noeud( tmp4->inf_data.child = malloc_child() , 14 , 0x49); // decoupage du 14eme caract�re entre B(42) et R(52) (details : a1211.txt)
					arbre_sup_set_val(tmp4, EVENT_FLAG, 6 );

						//val lvl 5, a121.txt
						tmp5 = tmp4->inf_data.child;
						arbre_inf_set_val(tmp5, EVENT_FLAG_RETURN_BLUE, 17 );
						arbre_sup_set_val(tmp5, EVENT_FLAG_RETURN_RED, 16 );

					//lvl 4, a121.txt
					tmp4 = tmp3->sup_data.child = malloc_child();
					child_noeud( tmp4 , 7 , 0x50); // decoupage du 7eme caractère entre F(46) et T(54) (details : a121.txt)
					arbre_inf_set_val(tmp4, EVENT_EXIT_FRAGLIMIT, 20 );
					arbre_sup_set_val(tmp4, EVENT_EXIT_TIMELIMIT, 21 );


				//lvl 3, a122.txt
				tmp3 = tmp2->sup_data.child = malloc_child();
				child_noeud( tmp3 , 7 , 0x50); // decoupage du 7eme caract�re entre D(44) et U(55) (details : a122.txt)

					//lvl 4, a1221.txt
					tmp4 = tmp3->inf_data.child = malloc_child();
					child_noeud( tmp4 , 9 , 0x70); // decoupage du 9eme caract�re entre n(6E) et s(73) (details : a1221.txt)
					child_noeud( tmp4->inf_data.child = malloc_child() , 9 , 0x69);  // decoupage du 9eme caract�re entre g(67) et n(6E) (details : a1221.txt)
					arbre_sup_set_val(tmp4, EVENT_CLIENTDISCONNECT, 18 );

						//val lvl 5, a122.txt
						tmp5 = tmp4->inf_data.child;
						arbre_inf_set_val(tmp5, EVENT_CLIENTBEGIN, 13 );
						arbre_sup_set_val(tmp5, EVENT_CLIENTCONNECT, 15 );

					//lvl 4, a122.txt
					tmp4 = tmp3->sup_data.child = malloc_child();
					child_noeud( tmp4 , 15 , 0x40);  // decoupage du 15eme caract�re entre :(3A) et C(43) (details : a122.txt)
					arbre_inf_set_val(tmp4, EVENT_CLIENTUSERINFO, 16 );
					arbre_sup_set_val(tmp4, EVENT_CLIENTUSERINFOCHANGED, 23 );

		//lvl 1, a2.txt
		tmp1 = (*a)->sup_data.child = malloc_child();
		child_noeud( tmp1 , 2 , 0x68);  // decoupage du 2eme caract�re entre h(68) et i(69) (details : a2.txt)

			//lvl 2, a21.txt
			tmp2 = tmp1->inf_data.child = malloc_child();
			child_noeud( tmp2 , 2 , 0x62); // decoupage du 2eme caract�re entre a(61) et c(63) (details : a21.txt)

				//lvl 3, a211.txt
				tmp3 = tmp2->inf_data.child = malloc_child();
				child_noeud( tmp3 , 4 , 0x70); // decoupage du 4eme caract�re entre m(6D) et t(74) (details : a211.txt)
				child_noeud( tmp3->inf_data.child = malloc_child() , 4 , 0x50); // decoupage du 4eme caract�re entre :(3A) et m(6D) (details : a211.txt)
				child_noeud( tmp3->sup_data.child = malloc_child() , 6 , 0x67); // decoupage du 6eme caract�re entre a(61) et l(6C) (details : a211.txt)

					//val lvl 4, a211.txt
					tmp4 = tmp3->inf_data.child;
					arbre_inf_set_val(tmp4, EVENT_SAY, 5 );
					arbre_sup_set_val(tmp4, EVENT_WARMUP, 7 );
					tmp4 = tmp3->sup_data.child;
					arbre_inf_set_val(tmp4, EVENT_SAYTEAM, 9 );
					arbre_sup_set_val(tmp4, EVENT_SAYTELL, 9 );

				//lvl 3, a212.txt
				tmp3 = tmp2->sup_data.child = malloc_child();
				child_noeud( tmp3 , 3 , 0x6E); // decoupage du 3eme caract�re entre l(6C) et o(6F) (details : a212.txt)
				child_noeud( tmp3->inf_data.child = malloc_child() , 3 , 0x67); // decoupage du 3eme caract�re entre d(64) et l(6C) (details : a212.txt)
				child_noeud( tmp3->sup_data.child = malloc_child() , 3 , 0x70); // decoupage du 3eme caract�re entre o(6F) et u(75) (details : a212.txt)

					//val lvl 4, a212.txt
					tmp4 = tmp3->inf_data.child;
					arbre_inf_set_val(tmp4, EVENT_RED, 4 );
					arbre_sup_set_val(tmp4, EVENT_TELL, 6 );
					tmp4 = tmp3->sup_data.child;
					arbre_inf_set_val(tmp4, EVENT_SCORE, 7 );
					arbre_sup_set_val(tmp4, EVENT_SHUTDOWNGAME, 13 );

			//lvl 2, a22.txt
			tmp2 = tmp1->sup_data.child = malloc_child();
			child_noeud( tmp2 , 2 , 0x6E); // decoupage du 2eme caract�re entre n(6E) et o(6F) (details : a22.txt)

				//lvl 3, a221.txt
				tmp3 = tmp2->inf_data.child = malloc_child();
				child_noeud( tmp3 , 2 , 0x6B); // decoupage du 2eme caract�re entre i(69) et n(6E) (details : a221.txt)
				child_noeud( tmp3->inf_data.child = malloc_child() , 3 , 0x70); // decoupage du 3eme caract�re entre l(6C) et t(74) (details : a221.txt)
				child_noeud( tmp3->sup_data.child = malloc_child() , 5 , 0x50); // decoupage du 5eme caract�re entre G(47) et R(52) (details : a221.txt)

					//val lvl 4, a221.txt
					tmp4 = tmp3->inf_data.child;
					arbre_inf_set_val(tmp4, EVENT_KILL, 6 );
					arbre_sup_set_val(tmp4, EVENT_HIT, 5 );
					tmp4 = tmp3->sup_data.child;
					arbre_inf_set_val(tmp4, EVENT_INITGAME, 10 );
					arbre_sup_set_val(tmp4, EVENT_INITROUND, 11 );

				//lvl 3, a222.txt
				tmp3 = tmp2->sup_data.child = malloc_child();
				child_noeud( tmp3 , 2 , 0x74); // decoupage du 2eme caract�re entre t(74) et u(75) (details : a222.txt)
				child_noeud( tmp3->inf_data.child = malloc_child() , 2  , 0x70); // decoupage du 2eme caract�re entre o(6F) et t(74) (details : a222.txt)
				child_noeud( tmp3->sup_data.child = malloc_child() , 17 , 0x50); // decoupage du 17eme caract�re entre D(44) et R(52) (details : a2222.txt)

					//val lvl 4, a2222.txt
					tmp4 = tmp3->inf_data.child;
					arbre_inf_set_val(tmp4, EVENT_POP, 4 );
					arbre_sup_set_val(tmp4, EVENT_ITEM, 6 );
					tmp4 = tmp3->sup_data.child;
					// arbre_inf_set_val(*tmp4, EVENT_SCORE );
					child_noeud( tmp4->inf_data.child = malloc_child() , 17 , 0x43); // decoupage du 17eme caract�re entre B(42) et D(44) (details : a2222.txt)
					arbre_sup_set_val(tmp4, EVENT_SURVIVORWINNER_RED, 19 );

						//val lvl 5, a1222.txt
						tmp5 = tmp4->inf_data.child;
						arbre_inf_set_val(tmp5, EVENT_SURVIVORWINNER_BLUE, 20 );
						arbre_sup_set_val(tmp5, EVENT_SURVIVORWINNER_DRAW, 20 );

	return;
}

// permet de liberer la memoire d'un noeud et de ses enfants
void free_noeud( arbre a ){
	if ( !a->inf_is_val && a->inf_data.child != NULL)
		free_noeud( a->inf_data.child );
	if ( !a->sup_is_val && a->sup_data.child != NULL)
		free_noeud( a->sup_data.child );
	free( a );
}

// permet de liberer la memoire d'un arbre entier
void free_arbre( arbre* a ){
	free_noeud(*a);
	free(a);
}
